Searching বা অনুসন্ধান হল একটি ডেটা স্ট্রাকচারের মধ্যে একটি নির্দিষ্ট উপাদান খুঁজে বের করার প্রক্রিয়া। বিভিন্ন ধরনের ডেটা স্ট্রাকচারের জন্য অনুসন্ধান করার সময় time complexity বিভিন্ন হতে পারে। এটি বোঝা গুরুত্বপূর্ণ কারণ এটি প্রভাব ফেলে আপনার প্রোগ্রামের কার্যকারিতা এবং দক্ষতার উপর।
এই টিউটোরিয়ালে আমরা কয়েকটি জনপ্রিয় search algorithms এর time complexity এবং তাদের জাভাতে বাস্তবায়ন দেখব।
১. Search Efficiency এবং Time Complexity
Time complexity হল একটি অ্যালগরিদমের কাজের পরিমাণ, যা ইনপুট সাইজের উপর নির্ভর করে। এটি সাধারণত Big O notation এ প্রকাশ করা হয় এবং বিভিন্ন ধরনের অনুসন্ধান অ্যালগরিদমের সময় জটিলতা ভিন্ন হয়।
প্রধান অনুসন্ধান অ্যালগরিদমগুলো:
- Linear Search (Sequential Search): একটি অ্যারের প্রতিটি উপাদান একে একে চেক করে নির্দিষ্ট উপাদানটি খোঁজা হয়।
- Time Complexity: O(n), যেখানে n হল অ্যারের আকার।
- Binary Search: একটি সাজানো অ্যারে বা তালিকার মধ্যে divide and conquer পদ্ধতি ব্যবহার করে দ্রুত উপাদান খোঁজা হয়।
- Time Complexity: O(log n), যেখানে n হল অ্যারের আকার।
- Hash Search: Hashing টেকনিক ব্যবহার করে দ্রুত উপাদান খোঁজা হয়।
- Time Complexity: O(1) (গড় সময় জটিলতা), যদিও খারাপ কেসে O(n) হতে পারে।
- Jump Search: একটি সোজা পদ্ধতি যেখানে কিছু ধাপের জন্য উপাদানগুলো পার করে তোলা হয় এবং পরে লিনিয়ারভাবে অনুসন্ধান করা হয়।
- Time Complexity: O(√n), যেখানে n হল তালিকার আকার।
- Exponential Search: এটি একটি এলগরিদম যা binary search এর সাথে মিশ্রিত হয় এবং কিছু প্রাথমিক ধাপের জন্য উপাদান খোঁজার কাজ করে।
- Time Complexity: O(log n)
২. Linear Search (Sequential Search)
Linear Search হল একটি সহজতম অনুসন্ধান অ্যালগরিদম, যেখানে একটি অ্যারের প্রতিটি উপাদান একে একে চেক করা হয় যতক্ষণ না আমাদের কাঙ্ক্ষিত উপাদানটি পাওয়া যায়। এটি সাধারণত সজ্জিত বা অস্বচ্ছ অ্যারে অথবা তালিকার জন্য ব্যবহৃত হয়।
উদাহরণ: Linear Search in Java
public class LinearSearchExample {
public static int linearSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i; // Found the target, return its index
}
}
return -1; // Target not found
}
public static void main(String[] args) {
int[] arr = {5, 3, 9, 1, 6};
int target = 9;
int result = linearSearch(arr, target);
if (result != -1) {
System.out.println("Element found at index: " + result);
} else {
System.out.println("Element not found.");
}
}
}
ব্যাখ্যা:
- Time Complexity: O(n) - এখানে
nহল অ্যারের আকার, কারণ সব উপাদান পরীক্ষা করতে হতে পারে।
আউটপুট:
Element found at index: 2
৩. Binary Search
Binary Search হল একটি দ্রুত অনুসন্ধান অ্যালগরিদম যা শুধুমাত্র সজ্জিত অ্যারে বা তালিকার জন্য ব্যবহারযোগ্য। এটি divide and conquer পদ্ধতি ব্যবহার করে যেখানে প্রতিটি ধাপে অ্যারের মাঝখানে গিয়ে এলিমেন্টটির অবস্থান খোঁজা হয়।
উদাহরণ: Binary Search in Java
public class BinarySearchExample {
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2; // Calculate the mid index
// Check if target is present at mid
if (arr[mid] == target) {
return mid;
}
// If target is greater, ignore left half
if (arr[mid] < target) {
left = mid + 1;
}
// If target is smaller, ignore right half
else {
right = mid - 1;
}
}
return -1; // Target not found
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 6, 9};
int target = 6;
int result = binarySearch(arr, target);
if (result != -1) {
System.out.println("Element found at index: " + result);
} else {
System.out.println("Element not found.");
}
}
}
ব্যাখ্যা:
- Time Complexity: O(log n) - অ্যারে প্রতিটি ধাপে অর্ধেক ভাগ হয়ে যায়, এবং শুধুমাত্র সাজানো অ্যারের জন্য এটি কার্যকর।
আউটপুট:
Element found at index: 3
৪. Hash Search (HashMap)
Hashing একটি পদ্ধতি যা কীগুলির জন্য একটি হ্যাশ ফাংশন ব্যবহার করে দ্রুত অনুসন্ধান এবং অ্যাক্সেস করতে সাহায্য করে। HashMap একটি জনপ্রিয় ডেটা স্ট্রাকচার যা key-value pairs ধরে রাখে এবং এর মাধ্যমে খুব দ্রুত অনুসন্ধান সম্ভব হয়।
উদাহরণ: HashMap Search in Java
import java.util.HashMap;
public class HashSearchExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 5);
map.put("Banana", 3);
map.put("Cherry", 7);
String target = "Banana";
if (map.containsKey(target)) {
System.out.println(target + " found with value: " + map.get(target));
} else {
System.out.println(target + " not found.");
}
}
}
ব্যাখ্যা:
- Time Complexity: O(1) গড় সময়ে (hashing এর কারণে), তবে খারাপ কেসে (যদি হ্যাশ কলিশন ঘটে) O(n) হতে পারে।
আউটপুট:
Banana found with value: 3
৫. Jump Search
Jump Search একটি অনুসন্ধান অ্যালগরিদম যা একটি সজ্জিত অ্যারের মধ্যে ধাপে ধাপে অনুসন্ধান করে। এটি কিছু উপাদান পাড়ি দিয়ে খোঁজ শুরু করে, তারপর লিনিয়ারভাবে আগের ধাপে ফিরে আসতে থাকে।
উদাহরণ: Jump Search in Java
public class JumpSearchExample {
public static int jumpSearch(int[] arr, int target) {
int n = arr.length;
int step = (int) Math.sqrt(n); // Jump size
int prev = 0;
// Jump to the next block
while (arr[Math.min(step, n) - 1] < target) {
prev = step;
step += (int) Math.sqrt(n);
if (prev >= n) {
return -1; // Target not found
}
}
// Perform linear search within the block
for (int i = prev; i < Math.min(step, n); i++) {
if (arr[i] == target) {
return i;
}
}
return -1; // Target not found
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 6, 9};
int target = 6;
int result = jumpSearch(arr, target);
if (result != -1) {
System.out.println("Element found at index: " + result);
} else {
System.out.println("Element not found.");
}
}
}
ব্যাখ্যা:
- Time Complexity: O(√n) - প্রতিটি ধাপে অর্ধেক সাইজের ব্লক পাড়ি দেওয়া হয়, তারপর লিনিয়ারভাবে চেক করা হয়।
আউটপুট:
Element found at index: 3
৬. Time Complexity Summary of Searching Algorithms
| Algorithm | Time Complexity | Space Complexity | Description |
|---|---|---|---|
| Linear Search | O(n) | O(1) | সার্চের জন্য প্রতিটি উপাদান পরীক্ষা করা হয় |
| Binary Search | O(log n) | O(1) | শুধুমাত্র সাজানো অ্যারের জন্য ব্যবহৃত হয় |
| Hash Search | O(1) (average case) | O(n) (worst case) | হ্যাশ ফাংশন ব্যবহার করে দ্রুত অনুসন্ধান |
| Jump Search | O(√n) | O(1) | ব্লক অনুযায়ী অনুসন্ধান করা হয় |
| Exponential Search | O(log n) | O(1) | কিছু উপাদানকে দ্রুত পাড়ি দেওয়া হয় তারপর বাইনরি সার্চ করা হয় |
সারাংশ
Searching Algorithms হল ডেটার মধ্যে দ্রুত নির্দিষ্ট উপাদান খুঁজে বের করার জন্য ব্যবহৃত টেকনিক। Linear Search, Binary Search, Hash Search, এবং Jump Search এর মতো বিভিন্ন অ্যালগরিদমের বিভিন্ন time complexity এবং space complexity রয়েছে। আপনার প্রয়োজনে সঠিক অনুসন্ধান অ্যালগরিদম নির্বাচন করে, আপনি কোডের কার্যকারিতা অনেক বেশি উন্নত করতে পারবেন।
Read more